"""
匿名函数捕获变量值

问题：
    你用lambda定义了一个匿名函数，并想在定义时捕获到某些变量的值。
解决方案：
    如果你想让某个匿名函数在定义时就捕获到值，可以将那个参数值定义成默认参数即可。
"""


def use_lambda_error():
    """
    错误的示例
    """

    x = 10
    add = lambda y: x + y
    x = 20
    add_func = lambda y: x + y
    print(add(10))
    print(add_func(10))
    # 输出结果：
    """
    30
    30
    """

    # 原因：
    """
    奥妙在于lambda表达式中的x是一个自由变量， 在运行时绑定值，
    而不是定义时就绑定，这跟函数的默认值参数定义是不同的。 
    因此，在调用这个lambda表达式的时候，x的值是执行时的值。(延迟绑定)
    """


def use_lambda():
    """
    正确的示例
    """

    x = 10
    add = lambda y, x=x: x + y
    x = 20
    add_func = lambda y, x=x: x + y
    print(add(10))
    print(add_func(10))
    # 输出结果：
    """
    20
    30
    """


if __name__ == '__main__':
    use_lambda_error()
    use_lambda()
